package com.zhouyong.leetcode.两个数组的交集349;

import java.util.Arrays;

/**
 * @Author 99
 * @Date 2022/10/3 19:55
 * @Version 1.0
 */
public class Test {

    // 给定两个数组 nums1 和 nums2 ，返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序
    // 输入：nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    // 输出：[9,4]
    // 解释：[4,9] 也是可通过的

    public static void main(String[] args) {

        int[] nums1 = {4, 9, 5};
        int[] nums2 = {9, 4, 9, 8, 4};
        int[] intersection = intersection(nums1, nums2);
        for (int i : intersection) {
            System.out.println(i);
        }
    }

    public static int[] intersection(int[] nums1, int[] nums2) {

        // 复杂方法
//        HashSet<Integer> set = new HashSet<>(nums1.length);
//        HashSet<Integer> set1 = new HashSet<>(nums2.length);
//        for (int i = 0; i < nums1.length; i++) {
//            set.add(nums1[i]);
//        }
//        for (int i = 0; i < nums2.length; i++) {
//            if (set.contains(nums2[i])) {
//                set1.add(nums2[i]);
//            }
//        }
//        Integer[] array = set1.toArray(new Integer[]{});
//        return Arrays.stream(array).mapToInt(Integer::intValue).toArray();

        // 排序+双指针
        // 执行用时：2 ms, 在所有 Java 提交中击败了94.82%的用户
        // 内存消耗：41.3 MB, 在所有 Java 提交中击败了79.24%的用户
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int point1 = 0, point2 = 0, index = 0;
        int[] newArray = new int[nums1.length + nums2.length];
        while (point1 <= nums1.length - 1 && point2 <= nums2.length - 1) {
            if (nums1[point1] == nums2[point2]) {
                if (index == 0 || nums1[point1] != newArray[index - 1]) {
                    newArray[index] = nums1[point1];
                    index++;
                }
                point1++;
                point2++;
            } else if (nums1[point1] > nums2[point2]) {
                point2++;
            } else {
                point1++;
            }
        }
        return Arrays.copyOfRange(newArray, 0, index);
    }
}
